package ThreadingSafety;

/**
 * Created with IntelliJ IDEA..
 * Description: 验证 volatile 不能保证 原子性  --> 该程序输出结果不是 100000 !.
 *
 *      面试中 :.
 *      谈到 volatile 势必离不开 JMM -> Java Memory Model(Java 内存模型).
 *      volatile 禁止了 编译器优化, 避免了直接读取CPU或缓存上中缓存的数据, 而是每次都从 内存 重新读取~.
 *      而在 java 中,为了让上述代码 更严谨 更通用,引入了一些新的术语: CPU或缓存 叫做 工作内存, 内存叫做主内存~~.
 *.
 *      所以站在 JMM角度看待 volatile 的话 :.
 *      正常执行的程序, 会把主内存的数据, 先加载到工作内存中, 再进行计算处理~~.
 *      但是由于编译器的优化, 可能会导致不是每一次都是从主内存中读取数据, 而是直接读取从工作内存中的缓存数据.(就有可能导致 内存可见性 问题)..
 * Date: 2022-09-13.
 * Time: 20:02.
 */

class Counter1 {//
    public volatile int count = 0;//

    public void increase() {
        count++;
    }//
}

public class TestDemo16 {//
    public static void main(String[] args) throws InterruptedException {//
        Counter1 counter1 = new Counter1();//

        Thread t1 = new Thread(() -> {//
            for (int i = 0; i < 5_0000; i++) {//
                counter1.increase();//
            }//
        });//
        Thread t2 = new Thread(() -> {//
            for (int i = 0; i < 5_0000; i++) {//
                counter1.increase();//
            }//
        });//
        t1.start();//
        t2.start();//

        t1.join();//
        t2.join();//
        System.out.println(counter1.count);//
    }//
}//
// TestDemo 17 中 将讲解 wait 和 notify .//
